package com.swan.core.utils.core;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.Collection;
import java.util.List;
import java.util.Objects;

/** 参数处理工具类，核心逻辑：<br/>
 *  1) 对于空字符串，返回 null  <br/>
 *  2) 对于值为 0 的 int/long 返回 null  <br/>
 *  3) 对于size为 0 的 collection 返回 null  <br/>
 */
@Slf4j
public class ParamUtil {

    /** 获取字符串参数
     * @param param null 或者 字符串
     * @return String or null   <br/>
     *  1. 空字符串(null或者空串)，返回 null         <br/>
     *  2. 非空字符串，返回去除前后空格的字符串
     */
    public static String get(String param) {
        return StringUtils.isNotBlank(param) ? param.trim() : null;
    }

    /** 获取 Long 类型参数，如果值为0，则返回 null
     * @param param null 或者 数字
     * @return Long or null   <br/>
     */
    public static Long get(Long param) {
        return Objects.nonNull(param) && param != 0 ? param : null;
    }

    /** 获取 Integer 类型参数，如果值为0，则返回 null
     * @param param null 或者 数字
     * @return Integer or null   <br/>
     */
    public static Integer get(Integer param) {
        return Objects.nonNull(param) && param != 0 ? param : null;
    }

    /** 获取集合类型参数
     * @param param null 或者 集合
     * @return Collection or null   <br/>
     * 1. 如果 param 为 null 或者 size==0，返回 null <br/>
     * 2. 否则，返回原集合 param
     */
    public static Collection get(Collection param) {
        return Objects.nonNull(param) && param.size() > 0 ? param : null;
    }

    /** 获取 List 类型参数
     * @param param null 或者 集合
     * @return List<T> or null   <br/>
     * 1. 如果 param 为 null 或者 size==0，返回 null <br/>
     * 2. 否则，返回原集合 param
     */
    public static <T> List<T> get(List<T> param) {
        return Objects.nonNull(param) && param.size() > 0 ? param : null;
    }

    /** 获取字符串参数
     * @param param null 或者 defaultValue
     * @return String or defaultValue   <br/>
     *  1. 空字符串(null或者空串)，返回 defaultValue         <br/>
     *  2. 非空字符串，返回去除前后空格的字符串
     */
    public static String get(String param, String defaultValue) {
        return StringUtils.isNotBlank(param) ? param.trim() : defaultValue;
    }

    /** 将字符串参数转换为 Int 参数
     * @param param int 类型字符串
     * @return Integer or null      <br/>
     * 1. 当 param 为 null 或 空字符串 ，返回 null <br/>
     * 1. 当 param 为  "0" 时，返回 null  <br/>
     * 2. 当 字符串 无法转换为Integer 时，返回 null <br/>
     * 3. 正常返回 param 对应的 Integer 值 <br/>
     */
    public static Integer getInt(String param) {
        String strValue = get(param);
        if (StringUtils.isBlank(param)) {
            return null;
        }

        try {
            Integer value = Integer.valueOf(strValue.trim());
            return value.intValue() > 0 ? value : null;
        } catch (Exception ex) {
            log.warn("String -> Int 类型转换失败:", ex);
        }
        return null;
    }

    /** 将字符串参数转换为 Long 参数
     * @param param int 类型字符串
     * @return Integer or null      <br/>
     * 1. 当 param 为 null 或 空字符串 ，返回 null <br/>
     * 1. 当 param 为  "0" 时，返回 null  <br/>
     * 2. 当 字符串 无法转换为Integer 时，返回 null <br/>
     * 3. 正常返回 param 对应的 Integer 值 <br/>
     */
    public static Long getLong(String param) {
        String strValue = get(param);
        if (StringUtils.isBlank(param)) {
            return null;
        }

        try {
            Long value = Long.valueOf(strValue.trim());
            return value.longValue() > 0 ? value : null;
        } catch (Exception ex) {
            log.warn("String -> Long 类型转换失败:", ex);
        }
        return null;
    }

    /** 将字符串参数转换为 Boolean 参数
     * @param param int 类型字符串
     * @return true/false/null      <br/>
     * 1. 当 param 为 null 或 空字符串 ，返回 null <br/>
     * 2. 当 字符串 无法转换为 Boolean 时，返回 false <br/>
     * 3. 正常返回 param 对应的 Boolean 值 <br/>
     */
    public static Boolean getBoolean(String param) {
        String strValue = get(param);
        if (StringUtils.isBlank(param)) {
            return null;
        }

        // 非法字符串会转换成 false
        return Boolean.valueOf(strValue.trim());
    }

}
